文章目錄
  1. 1. 开发环境
  2. 2. Native链接其它库
  3. 3. 无法进入Native代码
    1. 3.1. 方法总结
    2. 3.2. 采用实验版插件调试
  4. 4. Native引用STL库
  5. 5. 示例代码

网上用Android Studio调试NDK的资料不多且分散。我将这几天踩过的坑及经验纪录一下,方便其它朋友。我将从导入一个NDK Samples中的项目开始。

演示代码放在GitHub上,每个坑为一次Submit。

开发环境

  • 操作系统: Mac OS 10.11.1
  • IDE: Android Studio 1.5.1
  • NDK: android-ndk-r10e

Native链接其它库

加载NDK Samples中的hello-gl2项目后,直接运行会出现如下错误:

Error:(39) undefined reference to `glGetError'
Error:(41) undefined reference to `__android_log_print'
...

build.gradle文件中添加命令来链接相关库,具体可见Mac下用Android Studio运行NDK samples

无法进入Native代码

解决库链接问题后,程序能运行正确运行在设备上,可无法中断在Native代码上的断点处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
ndk {
debuggable = true
}

}
debug {
debuggable = true
jniDebuggable = true
}

}
  • 移除项目下的jniLibs文件夹

目测这个不移除,默认就会调用里面的代码,而不走新编译的Native库。

方法总结

  1. 修改build.gradle中的*buildTypes,使app-native可调试
  2. 移除项目中的jniLibs文件夹

采用实验版插件调试

更简单的方法是,按照Experimental Plugin User Guide介绍,在Android Studio中可以采用实验版插件进行调试。最快捷的方式是直接从Google的GitHub上check最新的代码即可。

Native引用STL库

gl_code.cpp中添加如下代码:

1
2
#include <string>
using namespace std;

运行程序,报出错误string: No such file or directory。解决的方法是:修改build.gradle中的defaultConfig{..}如下:
修改配置

P.S. build.gradle配置修改可参考

注意:
如果按照以上方法配置,将忽略项目中已存在的Android.mk文件而自动生成一个位于build文件夹下的Android.mk。Android Studio默认编译jni文件夹下东西,且项目中的Application.mk文件配置将失效。上图链接STL库设置编译选项Application.mk中相应的配置选如下:

1
2
APP_STL := gnustl_static
APP_CPPFLAGS := -std=c++11

示例代码

ndk-debugging

文章目錄
  1. 1. 开发环境
  2. 2. Native链接其它库
  3. 3. 无法进入Native代码
    1. 3.1. 方法总结
    2. 3.2. 采用实验版插件调试
  4. 4. Native引用STL库
  5. 5. 示例代码